package daoLivraria;

import java.sql.*;
import java.util.*;

public class LivroDAO {

    private Connection con;
    private Statement stmt;

    public LivroDAO() {
        try {
            this.con = DataSourceDAO.getConnection();
            // criar statement
            this.stmt = con.createStatement();
        } catch (Exception sql1) {
            System.out.println("Erro em base de dados: " + sql1.toString());
        }
    }

    public void finalize() {
        //try {
        //    this.con.close();
        //} catch (SQLException sql1) {}
    }

    public LivroTO find(int id) {
        try {
            ResultSet rs = this.stmt.executeQuery("select * from livros where livro_id = "+id);
            if (rs.next()) {
                LivroTO livro = new LivroTO();
                livro.setLivro_id(rs.getInt("livro_id"));
                livro.setTitulo(rs.getString("titulo"));
                livro.setAutor(rs.getString("autor"));
                livro.setPreco(rs.getDouble("preco"));
                livro.setDescricao(rs.getString("descricao"));
                livro.setEditora(rs.getString("editora"));
                livro.setAno(rs.getInt("ano"));
                livro.setReserva(rs.getInt("reserva"));
                livro.setGenero_id(rs.getInt("genero_id"));
                livro.setCapa(rs.getBytes("capa"));
                return livro;
            } else {
                return null;
            }
        } catch (SQLException sql1) {
            System.out.println("ERRO: "+sql1);
            return null;
        }
    }

    public ArrayList<LivroTO> listAll() {
        try {
            ArrayList<LivroTO> lista = new ArrayList();
            ResultSet rs = this.stmt.executeQuery("select * from livros order by livro_id");
            while (rs.next()) {
                LivroTO livro = new LivroTO();
                livro.setLivro_id(rs.getInt("livro_id"));
                livro.setTitulo(rs.getString("titulo"));
                livro.setAutor(rs.getString("autor"));
                livro.setPreco(rs.getDouble("preco"));
                livro.setDescricao(rs.getString("descricao"));
                livro.setEditora(rs.getString("editora"));
                livro.setAno(rs.getInt("ano"));
                livro.setReserva(rs.getInt("reserva"));
                livro.setGenero_id(rs.getInt("genero_id"));
                lista.add(livro);
            }
            return lista;
        } catch (SQLException sql1) {
            System.out.println(sql1.toString());
            return null;
        }
    }

    public ArrayList<LivroTO> listByTitulo(String t) {
        try {
            ArrayList<LivroTO> lista = new ArrayList();
            ResultSet rs = this.stmt.executeQuery("select * from livros where titulo like '%"+t+"%' order by titulo");
            while (rs.next()) {
                LivroTO livro = new LivroTO();
                livro.setLivro_id(rs.getInt("livro_id"));
                livro.setTitulo(rs.getString("titulo"));
                livro.setAutor(rs.getString("autor"));
                livro.setPreco(rs.getDouble("preco"));
                livro.setDescricao(rs.getString("descricao"));
                livro.setEditora(rs.getString("editora"));
                livro.setAno(rs.getInt("ano"));
                livro.setReserva(rs.getInt("reserva"));
                livro.setGenero_id(rs.getInt("genero_id"));
                lista.add(livro);
            }
            return lista;
        } catch (SQLException sql1) {
            System.out.println(sql1.toString());
            return null;
        }
    }

    public ArrayList<LivroTO> listByGenero(int id) {
        try {
            ArrayList<LivroTO> lista = new ArrayList();
            ResultSet rs = this.stmt.executeQuery("select * from livros where genero_id = "+id+" order by titulo");
            while (rs.next()) {
                LivroTO livro = new LivroTO();
                livro.setLivro_id(rs.getInt("livro_id"));
                livro.setTitulo(rs.getString("titulo"));
                livro.setAutor(rs.getString("autor"));
                livro.setPreco(rs.getDouble("preco"));
                livro.setDescricao(rs.getString("descricao"));
                livro.setEditora(rs.getString("editora"));
                livro.setAno(rs.getInt("ano"));
                livro.setReserva(rs.getInt("reserva"));
                livro.setGenero_id(rs.getInt("genero_id"));
                lista.add(livro);
            }
            return lista;
        } catch (SQLException sql1) {
            System.out.println(sql1.toString());
            return null;
        }
    }

    public boolean delete(LivroTO livro) {
        try {
            // em um método real, fazer a comparacao do where campo a campo
            int ret = this.stmt.executeUpdate("delete from livros where livro_id = "+livro.getLivro_id());
            if (ret == 1) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException sql1) {
            System.out.println("ERRO: "+sql1);
            return false;
        }
    }

    public boolean update(LivroTO livro) {
        try {
            // em um método real, fazer a comparacao do where campo a campo
            String sql = "update livros set titulo = '"+livro.getTitulo()+"', autor = '"+livro.getAutor()+"'"+
                    ", editora = '"+livro.getEditora()+"', ano = "+livro.getAno()+", genero_id = "+livro.getGenero_id()+"," +
                    " descricao = '"+livro.getDescricao()+"', preco = "+livro.getPreco()+", " +
                    "estoque = "+livro.getEstoque()+", reserva = "+livro.getReserva()+" where livro_id = "+livro.getLivro_id();
            System.out.println("Comando SQL: "+sql);
            int ret = this.stmt.executeUpdate(sql);
            if (ret == 1) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException sql2) {
            System.out.println("ERRO: "+sql2);
            return false;
        }
    }

    public boolean insert(LivroTO livro) {
        try {
            // em um método real, fazer a comparacao do where campo a campo
            String sql = "insert into livros (livro_id, titulo, autor, editora, ano, genero_id, descricao, preco, estoque, reserva) values " +
                    " ("+livro.getLivro_id()+",'"+livro.getTitulo()+"', '"+livro.getAutor()+"'"+
                    ", '"+livro.getEditora()+"', "+livro.getAno()+", "+livro.getGenero_id()+"," +
                    " '"+livro.getDescricao()+"', "+livro.getPreco()+", " +
                    livro.getEstoque()+", "+livro.getReserva()+")";
            System.out.println("Comando SQL: "+sql);
            int ret = this.stmt.executeUpdate(sql);
            if (ret == 1) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException sql2) {
            System.out.println("ERRO: "+sql2);
            return false;
        }
    }

}
